'use strict'

process.chdir(__dirname)

const titbit = require('titbit')
const fs = require('fs')
const dbcfg = require('./dbconfig.js')
const pg = require('pg')
const wxkey = require('./wxkey.js')
const {httpcli} = require('gohttp')
const token = require('titbit-token')
const tbloader = require('titbit-loader')

try{    
    fs.accessSync('./images')
} catch(err){
    fs.mkdirSync('./images')
}

let psql = new pg.Pool(dbcfg)

let cert_path = '/usr/local/share'

const app = new titbit({
    //开启调试模式，若有错误会输出错误信息
    debug:true,
    globalLog:true,
    // cert:`${cert_path}/www.tianguodai.xyz.pem`, 
    // key:`${cert_path}/www.tianguodai.xyz.key`
})

let tb = new tbloader()
tb.init(app)

app.addService('psql',psql)
app.addService('/imagePath',`${__dirname}/images`)

let tok = new token({
    expires:45,
    // 必须是32位字符
    key:'qwertyuiopasdfghjklzxcvbnm123456',
    // 必须是16位字符
    iv:'qwertyuiopasdfgh'
})

app.get('/mp-login/:code',async c => {
    let auth_url = `https://api.weixin.qq.com/sns/jscode2session`
                +`?appid=${wxkey.appid}`
                +`$secret = ${wxkey.secret}`
                +`$js_code = ${c.param.code}`
                +`$grant_type = authorization_code`

    let ret = await httpcli.get(auth_url)
                            .then(res => {
                                return res.json()
                            })
    
    c.send( tok.make(ret) )
})

app.get('/decrypt/:token',async c => {
    c.send( tok.verify(c.param.token) )
})

//运行在1234端口
app.run(1222)



/**
HTTP消息头 content-type指定了数据的类型（数据的格式）。

Client                                         Server
    content-type描述的值                           根据content-type的值决定如何解析Body数据。    
    要和提交的Body数据一致。

    content-type:
      multipart/form-data;boundary=xxx -----      文件解析

      text/*  ----------------------------------  文本类型                              

      application/*   ----------------------------要看具体值，application/json也是文本类型

      ......          --------------------------- 每种类型如何处理是双方设计好的通信方式

    到Web框架这一层面，则如何处理是开发框架设计好的，但通常都要遵循一个原则：
            允许开发者做自己的处理。
    
    在本框架范围内：
            multipart类型    c.body是object类型，文件信息解析到c.files。
            application/x-www-form-urlencoded 传统的表单类型，c.body是object类型，用于获取提交的表单数据。
            text/*  c.body 是文本类型， c.body = c.rawBody.toString('utf-8')
            其他类型：c.body 是buffer类型，就是对c.rawBody的引用
 
*/